package com.sxj.corejava.util;

/**
 * @author 石小俊
 * @date 2024年03月09日 11:28
 * 定义一个数组工具类,实现以下方法
 * 1.随机生成一个int类型的数组,通过方法的参数控制数组的长度、以及取值范围
 * 其值为指定范围x-y之间的整数,且不能重复。参数有三个:数组长度、最小值、最大值
 * 2.实现复制数组的方法,将源数组的所有元素复制到目标数组中。两个参数:源数组,目标数组
 * 3.实现输出数组中元素的功能,要求数组的元素以短横杠-分隔
 * 4.实现交换指定数组中指定位置的两个元素的值
 * 5.将指定数组的所有元素颠倒过来,倒序
 */
public class ArrayUtil {

    public static void main(String[] args) {
        int[] arr = createIntArray(10, 1, 10);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        int[] dist = new int[10];
        copyArray(arr, dist);
        for (int i = 0; i < dist.length; i++) {
            System.out.print(dist[i] + " ");
        }

        System.out.println();
        show(arr);
        change(arr, 1, 5);
        show(arr);
        reverse(arr);
        show(arr);
    }

    /**
     * 随机生成一个int类型的数组,通过方法的参数控制数组的长度、以及取值范围
     * 值为指定范围x-y之间的整数,且不能重复。参数有三个:数组长度、最小值、最大值
     * @param length 长度不能小于y-x+1
     * @param x
     * @param y
     * @return
     */
    public static int[] createIntArray(int length, int x, int y) {
        int[] arr = new int[length];
        for (int i = 0; i < arr.length; i++) {
            // 随机生成一个x-y的整数,将其赋值给对应的数组元素
            arr[i] = (int) (Math.random() * (y - x + 1) + x);
            // 此时随机生成的数组元素可能存在重复的,我们此处的需求要求不能重复
            // 因此,当生成了元素之和,需要将当前生成的元素与已经生成好的元素进行比较
            // 判断是否重复
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {
                    // 如果相等,说明已经重复了
                    // 此时需要重新生成当前的数组元素
                    i--;
                    // 当已经存在重复的元素之和,则不需要继续比较
                    // 结束当前for循环
                    break;
                }
            }
        }
        return arr;
    }

    /**
     * 实现复制数组的方法,将源数组的所有元素复制到目标数组中。两个参数:源数组,目标数组
     * 此时两个数组类型、长度必须一致
     * @param src  源数组
     * @param dist 目标数组
     */
    public static void copyArray(int[] src, int[] dist) {
        for (int i = 0; i < src.length; i++) {
            dist[i] = src[i];
        }
    }

    /**
     * 实现输出数组中元素的功能,要求数组的元素以短横杠-分隔
     * @param arr
     */
    public static void show(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i != arr.length - 1) {
                System.out.print(arr[i] + ", ");
            } else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
    }

    /**
     * 实现交换指定数组中指定位置的两个元素的值
     * @param arr
     * @param i
     * @param j
     */
    public static void change(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 将指定数组的所有元素颠倒过来,倒序
     * @param arr
     */
    public static void reverse(int[] arr) {
        for (int i = 0; i < arr.length / 2; i++) {
            // i与倒数第i个元素换
            int j = arr.length - 1 - i;
            change(arr, i, j);
        }
    }
}
